package ciicos.util.convert;

import ciicos.base.entity.DictionaryDataEntity;
import ciicos.util.ListUtil;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;

    @Accessors(chain = true)
    public class DataDicConvert{
        private List<DictionaryDataEntity> dictList;
        private Map<String, String> codeToNameMap ;
        private DataDicConvert(){

        }
        public DataDicConvert(List<DictionaryDataEntity> dictList){
            this.dictList = dictList ==null ?new ArrayList<>():dictList;
            // 1. 字典转为 Map<编码, 名称>（提高查询效率）
            codeToNameMap = dictList.stream()
                    .collect(Collectors.toMap(
                            DictionaryDataEntity::getEnCode,
                            DictionaryDataEntity::getFullName,
                            (existing, replacement) -> existing // 编码重复时保留第一个
                    ));
            //2.还需要根据id查询
            codeToNameMap.putAll(
                    dictList.stream()
                            .collect(Collectors.toMap(
                                    DictionaryDataEntity::getId,
                                    DictionaryDataEntity::getFullName,
                                    (existing, replacement) -> existing // 编码重复时保留第一个
                            ))
            );
        }
        public <T> void replaceCodeWithName(
                List<T> list,
                Function<T, String> codeGetter,  // 函数：T -> 编码（如 user -> user.getDeptCode()）
                BiConsumer<T, String> nameSetter // 函数：(T, 名称) -> 设置名称（如 (user, name) -> user.setDeptName(name)）
        ) {
            if(ListUtil.isEmpty(list)){
                return ;
            }
            list.forEach(t -> {
                String code = codeGetter.apply(t); // 通过函数获取编码
                String name = codeToNameMap.getOrDefault(code, code); // 查字典，默认保留原编码
                nameSetter.accept(t, name); // 通过函数设置名称
            });
        }
        public <T> void replaceCodeWithName(T t,Function<T, String> codeGetter,BiConsumer<T, String> nameSetter){
            if(t==null){
                return ;
            }
            String code = codeGetter.apply(t); // 通过函数获取编码
            String name = codeToNameMap.getOrDefault(code, code); // 查字典，默认保留原编码
            nameSetter.accept(t, name);
        }
        public <T> String getCodeWithName(T t,Function<T, String> codeGetter){
            if(t==null){
                return "";
            }
            String code = codeGetter.apply(t); // 通过函数获取编码
            String name = codeToNameMap.getOrDefault(code, code); // 查字典，默认保留原编码
            return name;
        }
        public String getCodeWithName(String code){
            String name = codeToNameMap.getOrDefault(code, code); // 查字典，默认保留原编码
            return name;
        }

    }